// Kony

#pragma once

#include "CoreMinimal.h"
#include "UI/WidgetController/BaseWidgetController.h"
#include "AbilitySystemComponent.h"
#include "OverlayWidgetController.generated.h"

class UBaseUserWidget;
class UBaseAbilitySystemComponent;

//资产数据TAG的行结构体,用于检索资产的TAG发送消息
USTRUCT(BlueprintType)
struct FUIWidgetRow : public FTableRowBase
{
	GENERATED_BODY();
	//消息标签
	UPROPERTY(EditAnywhere,BlueprintReadOnly)
	FGameplayTag MessageTag = FGameplayTag();
	//消息文本
	UPROPERTY(EditAnywhere,BlueprintReadOnly)
	FText MessageText = FText();
	//消息小部件
	UPROPERTY(EditAnywhere,BlueprintReadOnly)
	TSubclassOf<UBaseUserWidget> MessageWidget;
	//消息图标
	UPROPERTY(EditAnywhere,BlueprintReadOnly)
	UTexture2D* Image = nullptr;
};


// 创建声明一个动态多播委托，用于广播生命值变化事件
// 参数说明：
// FOnHealtChangedSignature - 委托类型名称 ，float - 参数类型，表示新的生命值 ，NewHealth - 参数名称，传递当前的生命值数值
/** 新增属性 需要修改这里 动态多播委托 **/

//数据集更变通用委托，就不需要单独属性增加委托了
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAttributeChangedSignature, float, NewValue);
//升级委托 布尔值是用于判断是否是升级 还是 赋值，是否播放特效
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnLevelChangedSignature, int32, NewValue, bool, bLevelUp);
//消息广播委托 用于处理所有小物件的游戏标签触发消息委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMessageWidgetRowSignature, FUIWidgetRow, Row);




/**
 * 继承自部件控制器基类的，覆盖层小部件控制器，目前主要用于主界面UI
 */
UCLASS(BlueprintType, Blueprintable)
class GASC_HUANLING_API UOverlayWidgetController : public UBaseWidgetController
{
	GENERATED_BODY()
public:
	//重写广播函数
	virtual void BroadcastInitializeValues() override;
	virtual void BindCallbacksToDependencies() override;
	
	/** 新增属性 需要修改这里 增加广播委托事件 **/
	//广播生命值变化事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnAttributeChangedSignature OnHealthChanged;

	//广播最大生命值变化事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnAttributeChangedSignature OnMaxHealthChanged;

	//广播法力值变化事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnAttributeChangedSignature OnManaChanged;

	//广播最大法力值变化事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnAttributeChangedSignature OnMaxManaChanged;
	
	//广播幽灵生命值变化事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnAttributeChangedSignature OnGhostHealthChanged;

	//广播幽灵法力值变化事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnAttributeChangedSignature OnGhostManaChanged;

	//广播消息触发事件
	UPROPERTY(BlueprintAssignable, Category = "GAS|Message")
	FMessageWidgetRowSignature MessageWidgetRowDelegate;

	//经验值百分比变化
	UPROPERTY(BlueprintAssignable, Category = "GAS|XP")
	FOnAttributeChangedSignature OnXPPercentChangedDelegate;
	//灵气值百分比变化
	UPROPERTY(BlueprintAssignable, Category = "GAS|XP")
	FOnAttributeChangedSignature OnLingQiPercentChangedDelegate;
	UPROPERTY(BlueprintAssignable, Category = "GAS|Level")
	FOnLevelChangedSignature OnPlayerLevelChangedDelegate;


protected:

	//游戏玩法标签消息数据表
	UPROPERTY(EditDefaultsOnly,BlueprintReadOnly,Category="Widgets Data")
	TObjectPtr<UDataTable> MessageWidgetDataTable;
	
	//从数据表中获取对应的标签数据
	template<typename T>
	T* GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag Tag);
 
	//绑定经验值变化委托
	void OnXPChanged(int32 NewXP);
	//绑定经验值变化委托
	void OnLingQiChanged(int32 NewLingQi);
	//绑定技能栏装备技能函数
	void OnAbilityEquipped(const FGameplayTag& AbilityTag, const FGameplayTag& Status, const FGameplayTag& Slot, const FGameplayTag& PreviousSlot) const;
	
};

template <typename T>
T* UOverlayWidgetController::GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag Tag)
{
	//通过TagName获取数据表行
	return DataTable->FindRow<T>(Tag.GetTagName(), TEXT(""));
}